<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>原始类型调用属性或者方法(Primitive type calling method)</title>
  <!-- 
  JavaScript 中的基本数据类型包括  `Undefined` 、 `Null` 、 `Boolean` 、 `Number` 、 `String`  和  `Symbol` 。这些类型在调用属性或方法时有其特定的行为。以下是详细说明与总结：
  1. Undefined
  - 定义：表示变量未被赋值。
  - 调用方法：没有属性或方法可调用，直接引用会返回  `undefined` 。
    let a;
    console.log(a); // 输出: undefined

  2. Null
  - 定义：表示一个空值或无值的对象。
  - 调用方法：同样没有属性或方法可调用，直接引用会返回  `null` 。
    let b = null;
    console.log(b); // 输出: null

  3. Boolean
  - 定义：表示逻辑实体，只有两个值： `true`  和  `false` 。
  - 调用方法：没有专门的方法，但可以通过布尔运算符进行逻辑运算。
    let isTrue = true;
    let isFalse = false;
    console.log(isTrue && isFalse); // 输出: false

  4. Number
  - 定义：表示数字，包括整数和浮点数。
  - 调用方法：可以调用  `Number`  对象的方法，例如  `toFixed()`  或  `toString()` 。
    let num = 42.12345;
    console.log(num.toFixed(2)); // 输出: 42.12
    console.log(num.toString());  // 输出: "42.12345"

  5. String
  - 定义：表示文本数据，由字符组成。
  - 调用方法：可以调用许多字符串方法，例如  `length` 、 `toUpperCase()` 、 `substring()`  等。
    let str = "Hello, World!";
    console.log(str.length);         // 输出: 13
    console.log(str.toUpperCase());  // 输出: "HELLO, WORLD!"
    console.log(str.substring(0, 5)); // 输出: "Hello"

  6. Symbol
  - 定义：表示独一无二且不可变的值，常用于对象属性的唯一标识符。
  - 调用方法：没有内置的方法，但可以通过  `String()`  将其转换为字符串进行查看。
    let sym = Symbol('description');
    console.log(String(sym)); // 输出: "Symbol(description)"

  总结
  - 不可变性：基本数据类型的值是不可变的，每次操作都会生成新的值。
  - 内存管理：基本数据类型在内存中存储的是值，而非引用。
  - 调用特性：
    -  `Undefined`  和  `Null`  没有属性和方法。
    -  `Boolean`  主要用于逻辑运算。
    -  `Number`  和  `String`  可以调用相应的方法进行转换和格式化。
    -  `Symbol`  是独一无二的，通常用于对象的属性名。

  理解 JavaScript 的基本数据类型及其调用属性和方法的特性，有助于更有效地编写和维护代码。
   -->
</head>
<body>

  <script>

    // 1. Undefined
    let a;
    console.log(a); // 输出: undefined

    // 2. Null
    let b = null;
    console.log(b); // 输出: null

    // 3. Boolean
    let c = true;
    console.log(c); // 输出: true

    // 4. Number
    let d = 42.12345;
    console.log(d.toFixed(2)); // 输出: 42.12
    console.log(Math.round(d)); // 输出: 42

    // 5. String
    let e = "Hello, World!";
    console.log(e.length);         // 输出: 13
    console.log(e.toUpperCase());  // 输出: "HELLO, WORLD!"
    console.log(e.substring(0, 5)); // 输出: "Hello"
    console.log(e.split(', '));    // 输出: ["Hello", "World!"]
    console.log(e.replace('World', 'JavaScript')); // 输出: "Hello, JavaScript!"
    console.log(e.includes('Hello')); // 输出: true
    console.log(e.startsWith('Hello')); // 输出: true
    console.log(e.endsWith('!')); // 输出: true
    console.log(e.charAt(0)); // 输出: "H"
    console.log(e.charCodeAt(0)); // 输出: 72
    
    // 6. Symbol
    let f = Symbol('description');
    console.log(String(f)); // 输出: "Symbol(description)"
    console.log(f.description); // 输出: "description"
    console.log(f.toString()); // 输出: "Symbol(description)"
    console.log(f.valueOf()); // 输出: Symbol(description)
    console.log(f === f); // 输出: true
    console.log(f === Symbol('description')); // 输出: false
    console.log(f === Symbol.for('description')); // 输出: false
    console.log(Symbol.for('description') === Symbol.for('description')); // 输出: true
    console.log(Symbol.keyFor(f)); // 输出: undefined

    // 7. BigInt
    let g = 1234567890123456789012345678901234567890n; // 使用 n 后缀表示 BigInt
    console.log(g.toString()); // 输出: "1234567890123456789012345678901234567890"
    console.log(g.valueOf()); // 输出: 1234567890123456789012345678901234567890n
    console.log(g + 1n); // 输出: 1234567890123456789012345678901234567891n
    console.log(g + 1); // 输出: 1234567890123456789012345678901234567891n
    console.log(g + '1'); // 输出: "12345678901234567890123456789012345678901"
    console.log(g === 1234567890123456789012345678901234567890n); // 输出: true
    
  </script>
  
</body>
</html>